/*
 * serializador.h
 *
 *  Created on: 09/09/2011
 *      Author: guido
 */

#ifndef SERIALIZADOR_H_
#define SERIALIZADOR_H_

#include "mensaje.h"
#include <iostream>
#include <cstring>

class Serializador {
public:

	/* Devuelve el numero con los bytes invertidos */
	int endianOpuesto(int i);

	/* Guarda en la posicion indice de codigo, el integer numero
	 * en formato big endian.
	 * El indice se incrementa en sizeof(int)
	 * Pre: codigo debe tener espacio suficiente para que entre
	 * el numero */
	void serializarInteger(char* codigo, int numero, int &indice);

	/* Guarda en la posicion indice en codigo, primero el tamaño de la
	 * cadena y luego la cadena. El tamaño de la cadena se guarda en
	 * en tantos bytes como sizeof(int). Ademas se incrementa indice
	 * hasta que sea la posicion final mas uno de lo escrito en codigo */
	void serializarCadena(char* codigo, std::string cadena, int &indice);

	/* Toma x cantidad de bytes (de acuerdo a sizeof(int)) de codigo
	 * lo interpreta como numero, y retorna dicho valor. Antes de
	 * retornarlo, debe transformarse a little endian, ya que se guarda
	 * en big endian. Además incrementa indice en sizeof(int) */
	int deserializarInteger(char* codigo, int &indice);

	/* Toma x cantidad (de acuerdo a sizeof(int) ) de codigo, lo intepreta
	 * como numero (luego de convertir a little endian), este numero
	 * representa el tamaño de la cadena. Luego se leeran tantos caracteres
	 * como tamaño de cadena encontrado, y se devuelve dicha cadena como
	 * string. Además incrementa indice hasta que quede al final de lo
	 * leido en codigo*/
	std::string deserializarCadena(char* codigo, int &indice);
};

#endif /* SERIALIZADOR_H_ */
